package cn.infrabase.crypto;

import java.security.Provider;

/**
 * 加密提供者上下文。
 *
 * @author Weimin Gao
 * @since 1.0.0
 **/
public enum GlobalBouncyCastleProvider {

    /**
     * 实例。
     */
    INSTANCE;

    /**
     * 加密提供者。
     */
    private final Provider provider;

    /**
     * 是否使用BouncyCastle加密提供者。
     */
    private static boolean useBouncyCastle = true;

    /**
     * <pre>
     * 构造函数。
     * 说明：
     * 1、如果存在BouncyCastle加密提供者时则创建并设置到当前上下文中。
     * </pre>
     */
    GlobalBouncyCastleProvider() {
        provider = CryptoProviderFactory.createBouncyCastleProvider();
    }

    /**
     * <pre>
     * 设置是否使用BouncyCastle加密提供者。
     * 说明：
     * 1、如果设置为false时表示强制关闭BouncyCastle而使用JDK。
     * </pre>
     *
     * @param isUseBouncyCastle 是否使用BouncyCastle加密提供者。
     */
    public static void setUseBouncyCastle(boolean isUseBouncyCastle) {
        useBouncyCastle = isUseBouncyCastle;
    }

    /**
     * 返回加密提供者。
     *
     * @return 加密提供者。
     */
    public Provider getProvider() {
        return useBouncyCastle ? this.provider : null;
    }

}
